/*
 * Créé le 12 mars 06
 */
package fr.cdesire.sudoku.utils;

import java.util.EmptyStackException;
import java.util.Stack;

/**
 * Cette classe étends une pile FILO d'éléments en y ajoutant une méthode qui permet de parcourir un arbre
 * de possibilités.
 * @author Cedric
 */
public class ArbreEtats extends Stack {

	/**
	 * Appelle le constucteur de la classe Stack.
	 */
	public ArbreEtats() {
		super();
	}

	/**
	 * Cette méthode ajoute un élément (constitué d'une pile
	 * d'états possibles de l'objet) à l'arbre. Si il n'y a pas de
	 * possibilités (élément vide), il revient vers l'élément
 	 * précédent de l'arbre et ainsi de suite jusqu'à trouver un
 	 * élément ayant au moins une possibilité. La méthode retourne
 	 * alors l'objet correspondant en le supprimant de l'arbre
 	 * (recherche par élimination).
	 * @param etats Pile d'états possibles de l'objet en cours.
	 * @return Dernier objet du dernier élément de l'arbre.
	 * @throws EmptyStackException Levée une fois que toutes les possibilités
	 * ont été testées avec echec.
	 */
	public Object getEtat(Stack etats) 
		throws EmptyStackException {
		
		this.push(etats);

		while(etats.isEmpty() && !this.isEmpty()) {
			this.pop();
			etats = (Stack)this.peek();
		}
		
		return (Object)etats.pop();
	}
}